package modelo;

import java.util.HashMap;
import java.util.Map;

public class Mapa<T> {
	
	public Map<Coordenada, T> map;
	protected Integer ancho;
	protected Integer alto;
	
	public Mapa(Integer ancho, Integer alto) {
		super();
		this.alto = alto;
		this.ancho = ancho;
		this.initMap();
	}
	
	protected void initMap(){
		this.map = new HashMap<Coordenada, T>();
		for (int y = 0; y < this.alto; y++) {
			for (int x = 0; x < this.ancho; x++) {
				this.map.put(new Coordenada(x, y), null);
			}
		}
	}
	
	public T get(Integer x, Integer y) {
		return map.get(new Coordenada(x, y));
	}
	
	public void agregar(Integer x, Integer y, T elem) {
		if (x < this.ancho && y < this.alto) {
			if (this.map.containsKey(new Coordenada(x, y))){
				this.map.remove(new Coordenada(x, y));
			}
			this.map.put(new Coordenada(x, y), elem);
		} else {
			throw new IndexOutOfBoundsException();
		}
	}
	
	public Boolean existe(Integer x, Integer y) {
		return this.map.containsKey(new Coordenada(x, y));
	}
	
	public Integer size(){
		return this.map.size();
	}

	public Integer getAncho() {
		return ancho;
	}

	public void setAncho(Integer ancho) {
		this.ancho = ancho;
	}

	public Integer getAlto() {
		return alto;
	}

	public void setAlto(Integer alto) {
		this.alto = alto;
	}
	
	public String toString() {
		String output = "";
		for (int y = 0; y < this.alto; y++) {
			for (int x = 0; x < this.ancho; x++) {
				if (this.map.get(new Coordenada(x, y)) == null) {
					output += "[N]";
				} else {
					output += "[C]";
				}
			}
			output += "\n";
		}
		return output;
	}
}
